home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1999 February
/
EnigmA AMIGA RUN 34 (1999)(G.R. Edizioni)(IT)[!][issue 1999-02].iso
/
earcd
/
devel
/
libx11
/
include
/
x11
/
wc
/
mapag.h
< prev
next >
Wrap
C/C++ Source or Header
|
1999-01-01
|
8KB
|
214 lines
#ifndef _MapAg_h_
#define _MapAg_h_
#include <X11/Wc/COPY>
/*
* SCCS_data: @(#) MapAg.h 1.6 92/06/10 06:11:07
*
* Mapping Agent - MapAg.h
*
* This include file describes an agent for associating arbitrary data. In all
* cases, the data consists of char* (pointers to anything).
*
* An adaptative hashing algorithm is used: when multiple collisions occur,
* an attempt is made to modify the hashing algorithm to reduce collisions.
*
* Functional Interface:
*
* MapAg_New() Create a new mapping agent
* MapAg_Free() Destroy an existing map database.
*
* MapAg_Define() Set mapping of (a,b,c) to data - replaces any
* existing mapping of (a,b,c) to anything.
* MapAg_Find() Find data associated with (a,b,c).
* MapAg_FindMap() Find Map which associates with (a,b,c).
* MapAg_Forget() Forget association from (a,b,c) to anything.
*
* All but the contructor (MapAg_New()) exist as macros and as actual functions.
* The functions perform sanity checks on the agent before invoking the methods.
* Otherwise, the functions do exactly the same thing as the macros. One should
* use the macros unless core dumps occur very near to agent method invocations.
*
* A mapping agent can also be statically declared using the MapAg_STATIC macro:
*
* static MapAgReg fooAgentRec = MapAg_STATIC;
* static MapAg fooAgent = &fooAgentRec;
*
*******************************************************************************
*/
#include <stdio.h>
#ifndef NeedFunctionPrototypes
#if defined(FUNCPROTO) || defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus)
#define NeedFunctionPrototypes 1
#else
#define NeedFunctionPrototypes 0
#endif /* __STDC__ */
#endif /* NeedFunctionPrototypes */
/* Macro for ANSI or K&R external declarations. Declare them like this:
** int foo _(( int bar, MapAg glorp ));
*/
#ifndef _
#if NeedFunctionPrototypes
#define _(a) a /* ANSI results in: int foo ( int bar, MapAg glorp ); */
#else
#define _(a) () /* K&R results in: int foo (); */
#endif
#endif
/* -- MapAg Method Type Declarations
*******************************************************************************
Integer return values are 1 if failure, 0 if OK.
*/
typedef struct _MapAgRec* MapAg;
typedef struct _MapRec* Map;
typedef void (*DefineMethod) _(( MapAg, char*, char*, char*, char* ));
typedef char* (*FindMethod) _(( MapAg, char*, char*, char* ));
typedef Map (*FindMapMethod) _(( MapAg, char*, char*, char* ));
typedef void (*ForgetMethod) _(( MapAg, char*, char*, char* ));
typedef void (*FreeMethod) _(( MapAg ));
typedef void (*ResizeMethod) _(( MapAg ));
/* -- Map and MapAg Object Declarations
*******************************************************************************
*/
typedef struct _MapRec { /* Stores one entry. */
char* a;
char* b;
char* c;
char* data;
struct _MapRec* next;
} MapRec;
typedef struct _MapAgRec { /* Stores hash table for mapping. */
Map* table; /* Pointer to hash table of Maps. */
int mask; /* Current size of hash table minus 1. */
int numMaps;/* Maps currently in hash table. */
int shiftA; /* used by Hash: num insig LSBs in `a' */
int shiftB; /* used by Hash: num insig LSBs in `b' */
int shiftC; /* used by Hash: num insig LSBs in `c' */
DefineMethod Define; /* Add/change the data mapped to a,b,c */
FindMethod Find; /* find data mapped to a,b,c */
FindMapMethod FindMap;/* find Map which maps a,b,c */
ForgetMethod Forget; /* forget any mapping of a,b,c */
FreeMethod Free; /* Free a MapAg and all its mappings */
ResizeMethod Resize; /* PRIVATE resize table method */
} MapAgRec;
/* -- MapAg Class Methods
*******************************************************************************
*/
extern MapAg MapAg_New(); /* allocate and initialize a new agent */
extern void MapAg_AssertLooksOk _(( MapAg, char*, int ));
/* usage: MapAg_AssertLooksOk( agent, __FILE__, __LINE__ ); */
/* -- MapAg Instance Methods
*******************************************************************************
The following macros should be used to invoke methods of Mapping Agents.
The assertions are disabled by defining NDEBUG (see assert(3)).
If they were actually implemented in C, the functions would be:
void MapAg_Define _(( MapAg, char* a, char* b, char* c, char* data ));
char* MapAg_Find _(( MapAg, char* a, char* b, char* c ));
Map MapAg_FindMap _(( MapAg, char* a, char* b, char* c ));
void MapAg_Forget _(( MapAg, char* a, char* b, char* c ));
void MapAg_Free _(( MapAg ));
Note that these macros cast all arguments to char* so the client does not
need to. Therefore, do NOT assume that the data is anything but a pointer!
Note that the agent argument is used twice! Don't use side effects!!
*/
#ifdef NDEBUG
#define MapAg_Define(ag,a,b,c,d) \
((ag)->Define((ag),(char*)(a),(char*)(b),(char*)(c),(char*)(d)))
#define MapAg_Find(ag,a,b,c) \
((ag)->Find((ag),(char*)(a),(char*)(b),(char*)(c)))
#define MapAg_FindMap(ag,a,b,c) \
((ag)->FindMap((ag),(char*)(a),(char*)(b),(char*)(c)))
#define MapAg_Forget(ag,a,b,c) \
((ag)->Forget((ag),(char*)(a),(char*)(b),(char*)(c)))
#define MapAg_Free(ag) ((ag)->Free(ag))
#else
#define MapAg_Define(ag,a,b,c,d) \
(MapAg_AssertLooksOk((ag),__FILE__,__LINE__), \
(ag)->Define((ag),(char*)(a),(char*)(b),(char*)(c),(char*)(d)))
#define MapAg_Find(ag,a,b,c) \
(MapAg_AssertLooksOk((ag),__FILE__,__LINE__), \
(ag)->Find((ag),(char*)(a),(char*)(b),(char*)(c)))
#define MapAg_FindMap(ag,a,b,c) \
(MapAg_AssertLooksOk((ag),__FILE__,__LINE__), \
(ag)->FindMap((ag),(char*)(a),(char*)(b),(char*)(c)))
#define MapAg_Forget(ag,a,b,c) \
(MapAg_AssertLooksOk((ag),__FILE__,__LINE__), \
(ag)->Forget((ag),(char*)(a),(char*)(b),(char*)(c)))
#define MapAg_Free(ag) \
(MapAg_AssertLooksOk((ag),__FILE__,__LINE__), \
(ag)->Free(ag))
#endif
/* -- Variable Method Declarations
*******************************************************************************
**** NEVER REFERENCE ANY OF THESE FUNCTIONS!! ****
They are only declared here so the MapAg_STATIC macro can be defined.
All integer return values reflect failure if non-zero.
*/
void MapAg_Define_Initial _(( MapAg, char*, char*, char*, char* ));
void MapAg_Define_Normal _(( MapAg, char*, char*, char*, char* ));
char* MapAg_Find_Initial _(( MapAg, char*, char*, char* ));
char* MapAg_Find_Normal _(( MapAg, char*, char*, char* ));
Map MapAg_FindMap_Initial _(( MapAg, char*, char*, char* ));
Map MapAg_FindMap_Normal _(( MapAg, char*, char*, char* ));
void MapAg_Forget_Initial _(( MapAg, char*, char*, char* ));
void MapAg_Forget_Normal _(( MapAg, char*, char*, char* ));
void MapAg_Free_Dynamic _(( MapAg ));
void MapAg_Free_Static _(( MapAg ));
void MapAg_Resize_Initial _(( MapAg ));
void MapAg_Resize_Normal _(( MapAg ));
/* -- Macro to allow mapping agents to be statically declared
*******************************************************************************
This macro must be coordinated with MapAg_New() so they both do
the same type of initialization. Static agents have a different
free method, of course.
*/
#define MapAg_STATIC { \
/* newAgent->table */ (Map*)0, \
/* newAgent->mask */ (int)0, \
/* newAgent->numMaps */ (int)0, \
/* newAgent->shiftA */ (int)0, \
/* newAgent->shiftB */ (int)0, \
/* newAgent->shiftC */ (int)0, \
/* newAgent->Define */ MapAg_Define_Initial, \
/* newAgent->Find */ MapAg_Find_Initial, \
/* newAgent->FindMap */ MapAg_FindMap_Initial, \
/* newAgent->Forget */ MapAg_Forget_Initial, \
/* newAgent->Free */ MapAg_Free_Static, \
/* newAgent->Resize */ MapAg_Resize_Initial \
}
#endif /* _MapAg_h_ */